אז.. מה זה סטטי ?
נגיד בתבנית סינגלטון, התכונה instance היא מוגדרת כprivate static .
למה להגדיר משהו כסטטי אם אין לו גישה מחוץ למחלקה? (כי הוא גם private)
זה הוריד לי את האסימון שלחשוב שסטטי זה לא רק כדי לגשת למשהו מחוץ למחלקה ויש לזה חשיבות מעבר..או שאני טועה וצריך לשבת בשקט אבל אני אחד שאוהב לשאול את שאני מבין הכול :)
יש מצב אתם מסבירים לי את העניין ?
תודה :)
6 תשובות
[מתודה/מאפיין] סטטי הוא לא שייך לאובייקט מסוים, אלא למחלקה מסוימת - אובייקט אחד משנה [מאפיין], וזה חל גם על כל שאר האובייקטים.
העיקרון הוא, כמו שאמרתי מקודם, זה שסטטי לא שייך לאובייקט. זה לא משנה אם הוא public, protected או private - הוא עדיין לא יהיה שייך לאובייקט מסוים.
בקשר לדוגמה שנתת על סינגלטון - אנחנו לא יכולים לגשת ממתודה סטטית (להלן: getInstance()) למאפיין לא-סטטי (להלן: instance), ולכן instance צריך להיות סטטי.
זה ההסבר הטכני, אבל מבחינה לוגית - הוא גם ככה אמור להיות סטטי, כי הוא לא שייך לאובייקט, אלא למחלקה.
השאלה הזו כבר נשאלה פה בעבר. אני בטוח שתוכל להיעזר בתשובות שם. :)
כל מה שאמרו לך הוא נכון והוא גם תקף ל-php. למה אתה חושב שזה לא תקף ל-php?
וכשאתה יוצר משתנה סטטי, זה אומר שבזיכרון יווצר רק משתנה אחד. לא משנה כמה אובייקטים תיצור מהמחלקה.
כשאתה יוצר משתנה לא סטטי במחלקה, אז בכל פעם שאתה יוצר אובייקט חדש מהמחלקה (new) אז כל פעם נוצר המשתנה פעם נוספת בזיכרון. למה? כי לכל אובייקט יש את המשתנים שלו.
לעומת זאת, משתנה סטטי הוא משתנה שנוצר פעם אחת בזיכרון והוא שייך למחלקה ולא לאובייקט.
במקרה של הסינגלטון, ה-instance שאנחנו שומרים לא שייך לאובייקט כלשהו. הוא שייך למחלקה, ואנחנו לא רוצים שבכל מופע חדש (instance) יווצר משתנה נוסף בזיכרון, אלא אנחנו רוצים משתנה אחד ויחיד.
במקרה של מתודות סטטיות זה קצת שונה. זה לא שמתודה סטטית נוצרת רק פעם אחת בזיכרון ומתודה לא סטטית נוצרת שוב ושוב בכל יצירת אובייקט. כל מתודה של אובייקט נוצרת פעם אחת, כשאתה מפעיל את אותה המתודה על פני אובייקטים שונים אז אותה המתודה רצה וההבדל היחידי הוא הערך של המשתנה this אצלה.
מתודה זטטית היא פשוט מתודה שמריצים דרך המחלקה ולא דרך אובייקט, ושאין לך משתנה this (כי היא לא חלק מאובייקט).
אהה סבבה תודה רבה על ההסברים :) גדולים אתם !!
וכי נגיד בסי שארפ, אפשר לקרוא למתודה סטטית בשם שלה פשוט, לא צריך להוסיף את השם של המחלקה. בPHP חייב את השם של המחלקה לפני השם של המתודה ככה שזה לא בדיוק אותו דבר חח.. אבל בסדר הבנתי את העקרון תודה לכם :))
לא הכי מבין ב-C#, אבל זה כנראה כי אתה קורא למתודה מתוך המחלקה שבה היא הוגדרה, לא? שם הכל זה מונחה עצמים. ב-PHP יש בשביל זה את self ואת static (שמתאים את עצמו לסביבה - למחלקות יורשות וכדו', לא משנה איפה הוא הוגדר).
ב-c# אתה יכול לקרוא למתודה בלי לציין את שם המחלקה רק אם היא בתוך אותה מחלקה.